package com.colorlight.cloud.gateway.api.message.constraint.basics.object;

import com.colorlight.cloud.gateway.api.message.constraint.basics.*;
import com.google.protobuf.Message;
import com.google.protobuf.MessageOrBuilder;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 *
 * @author Demon
 * @date 6/7/2023 下午7:18
 */
public interface Trans<J extends Trans<J, P>, P extends MessageOrBuilder> extends BasicsInterface<P, J> {
	// fixme : 无论反射的方向 都是java对象做的主导 这里希望加入 调用链  加入注解：是否处理注解 单向处理的属性加入注解
	/**
	 * 当前对象转为proto对象
	 *
	 * @return 目标对象
	 * @author Demon
	 */
	@Override
	@SuppressWarnings("unchecked")
	default P toProto(){
		Type[] types =
				((ParameterizedType) getClass().getGenericInterfaces()[0]).getActualTypeArguments();
		Class<P> pClass = (Class<P>) types[1];
		Message.Builder builder = DefaultTransToProtoRealize.objectToProto(this, pClass);
		return (P) builder.build();
	}
	
	/**
	 * 将protobuf对象透传入当前对象
	 *
	 * @param p protobuf对象
	 * @return 实体对象
	 * @author Demon
	 */
	@Override
	default J formProto(P p){
		return  DefaultTransFromProtoRealize.protoToObject(p,(J)this);
	}
}
